//
//  TextureMakerAndResponder.h
//  Pods
//
//  Created by imac_LRJ on 2022/6/7.
//

#import <UIKit/UIKit.h>
#import <CoreText/CoreText.h>
#import <CoreGraphics/CoreGraphics.h>
#import "LRJ_AttachmentProtocol.h"
#import "LRJ_CTextLayout.h"
#import "LRJ_ActiveRangePtotocol.h"
//#import "LRJ_TextureMakerAndResponder+touch.h"
NS_ASSUME_NONNULL_BEGIN

typedef BOOL (^TextureMakerShouldInterruptBlock)(void);


@class LRJ_TextureMakerAndResponder;

@protocol LRJ_TextureMakerAndResponderDelegate <NSObject>

@optional


/// dai
/// @param LRJ_TextureMaker 绘制工具
/// @param att 附件信息
/// @param frame 应该绘制到哪里
/// @param context ctx当前的
- (void)textDrawer:(LRJ_TextureMakerAndResponder *)LRJ_TextureMaker replaceAttachment:(id <LRJ_AttachmentProtocol>)att frame:(CGRect)frame context:(CGContextRef)context;

@end

@protocol LRJ_TextureMakerAndResponderEventDelegate <NSObject>

@required

- (UIView *)contextViewForTextDrawer:(LRJ_TextureMakerAndResponder *)textDrawer;

/**
 *  返回定义 textDrawer 可点击区域的数组
 *
 *  @param textDrawer 查询的 textDrawer
 *
 *  @return 由 (id<WMGTextActiveRange>) 对象组成的数组
 */
- (NSArray *)activeRangesForTextDrawer:(LRJ_TextureMakerAndResponder *)textDrawer;

/**
 *  响应对一个 activeRange 的点击事件
 *
 *  @param textDrawer 响应事件的 textDrawer
 *  @param activeRange  响应的 activeRange
 */
- (void)textDrawer:(LRJ_TextureMakerAndResponder *)textDrawer didPressActiveRange:(id<LRJ_ActiveRangePtotocol>)activeRange;

@optional
/**
 *  activeRange点击的 高亮事件
 *
 *  @param textDrawer 响应事件的 textDrawer
 *  @param activeRange  响应的 activeRange
 */
- (void)textDrawer:(LRJ_TextureMakerAndResponder *)textDrawer didHighlightedActiveRange:(id<LRJ_ActiveRangePtotocol>)activeRange rect:(CGRect)rect;

@optional
/**
 *  返回 textDrawer 是否要与一个 activeRange 进行交互，如点击操作
 *
 *  @param textDrawer 查询的 textDrawer
 *  @param activeRange  是否要与此 activeRange 进行交互
 *
 *  @return 是否与 activeRange 进行交互
 */
- (BOOL)textDrawer:(LRJ_TextureMakerAndResponder *)textDrawer shouldInteractWithActiveRange:(id<LRJ_ActiveRangePtotocol>)activeRange;

@end


@interface LRJ_TextureMakerAndResponder : UIResponder

// 文本绘制器的代理
@property (nonatomic, weak) id <LRJ_TextureMakerAndResponderDelegate> delegate;

// 文本绘制器的事件代理，用以处理混排图文中的可点击响应
@property (nonatomic, weak) id <LRJ_TextureMakerAndResponderEventDelegate> eventDelegate;


// 文本绘制器的绘制起点和绘制区域的定义，Frame会被拆解成两部分，origin决定绘制起点，size决定绘制区域大小
@property (nonatomic, assign) CGRect frame;

// CoreText排版模型封装
@property (nonatomic, strong, readonly) LRJ_CTextLayout *textLayout;

// 绘制原点 设置frame的时候就会设置好
@property (nonatomic, assign) CGPoint drawOrigin;


/**
 *  文本绘制器的基本绘制方法，绘制到当前上下文中
 */
- (void)draw;

/**
 *  将文本绘制器裹挟的内容绘制到指定上下文中
 *
 *  @param ctx      当前的 CGContext
 */
- (void)drawInContext:(CGContextRef)ctx;



/**
 *  将文本绘制器裹挟的内容绘制到指定上下文中，同时通过block控制中断
 *  中断意味着可以终止绘制流程，但不是一定会终止，这是由于多线程并发决定的，可以参考NSOperation的cancel方法的理念理解
 *
 *  @param ctx        当前的 CGContext
 *  @param block      中断block
 *
 */
- (void)drawInContext:(CGContextRef)ctx shouldInterruptBlock:(TextureMakerShouldInterruptBlock)block;




/**
 *  将文本绘制器裹挟的内容绘制到指定上下文中，同时通过block控制中断
 *  中断意味着可以终止绘制流程，但不是一定会终止，这是由于多线程并发决定的，可以参考NSOperation的cancel方法的理念理解
 *
 *  @param ctx                      当前的 CGContext
 *  @param visibleRect              可见区域
 *  @param replaceAttachments       是否替换组件
 *  @param block                    中断block
 *
 */
- (void)drawInContext:(CGContextRef)ctx visibleRect:(CGRect)visibleRect replaceAttachments:(BOOL)replaceAttachments shouldInterruptBlock:(TextureMakerShouldInterruptBlock)block;

@end

NS_ASSUME_NONNULL_END
